# -*- coding: utf-8 -*-
import unittest
import os
from datetime import datetime, timedelta
from app import db, app
from config import basedir
from app.models import User, Post

__author__ = 'nibo'


class TestCase(unittest.TestCase):
    def setUp(self):
        app.config['TESTING'] = True
        app.config['CSRF_ENABLED'] = False
        app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db')
        self.app = app.test_client()
        db.create_all()

    def tearDown(self):
        db.session.remove()
        db.drop_all()

    # 测试用户头像地址
    def test_avatar(self):
        u = User(nickname='John', email='john@example.com')
        avater = u.avatar(128)
        expected = 'http://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6'
        assert avater[0:len(expected)] == expected

    # 用户关注
    def test_follow(self):
        u1 = User(nickname='John', email='john@example.com')
        u2 = User(nickname='Susan', email='susan@example.com')
        db.session.add(u1)
        db.session.add(u2)
        db.session.commit()
        assert u1.unfollow(u2) is None
        u = u1.follow(u2)
        db.session.add(u)
        db.session.commit()
        assert u1.follow(u2) is None
        assert u1.is_following(u2)
        assert u1.followed.count() == 1
        assert u1.followed.first().nickname == 'Susan'
        assert u2.followers.count() == 1
        assert u2.followers.first().nickname == 'John'
        u = u1.unfollow(u2)
        assert u is not None
        db.session.add(u)
        db.session.commit()
        assert not u1.is_following(u2)
        assert u1.followed.count() == 0
        assert u2.followers.count() == 0

    # 查询关注用户微博信息
    def test_followed_posts(self):
        u1 = User(nickname='John', email='john@example.com')
        u2 = User(nickname='Susan', email='susan@example.com')
        u3 = User(nickname='Mary', email='mary@example.com')
        u4 = User(nickname='David', email='david@example.com')
        db.session.add(u1)
        db.session.add(u2)
        db.session.add(u3)
        db.session.add(u4)
        db.session.commit()
        utcnow = datetime.utcnow()
        p1 = Post(body='post from for john', author=u1, timestamp=utcnow + timedelta(seconds=1))
        p2 = Post(body='post from for susan', author=u2, timestamp=utcnow + timedelta(seconds=2))
        p3 = Post(body='post from for mary', author=u3, timestamp=utcnow + timedelta(seconds=3))
        p4 = Post(body='post from for david', author=u4, timestamp=utcnow + timedelta(seconds=4))
        db.session.add(p1)
        db.session.add(p2)
        db.session.add(p3)
        db.session.add(p4)
        db.session.commit()
        u1.follow(u1)
        u1.follow(u2)
        u1.follow(u4)
        u2.follow(u2)
        u2.follow(u3)
        u3.follow(u3)
        u3.follow(u4)
        u4.follow(u4)
        db.session.add(u1)
        db.session.add(u2)
        db.session.add(u3)
        db.session.add(u4)
        db.session.commit()
        f1 = u1.followed_posts().all()
        f2 = u2.followed_posts().all()
        f3 = u3.followed_posts().all()
        f4 = u4.followed_posts().all()
        assert len(f1) == 3
        assert len(f2) == 2
        assert len(f3) == 2
        assert len(f4) == 1
        assert f1 == [p4, p2, p1]
        assert f2 == [p3, p2]
        assert f3 == [p4, p3]
        assert f4 == [p4]
